﻿using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;

using WebShopAPI.Filter; //过滤器命名空间

namespace WebShopAPI.Controllers
{


    /// <summary>
    /// 需要使用JWT中数据 的Web API基类,如果web api需要使用前台用户数据,
    /// web api继承自该web api即可
    /// </summary>
    [CustomException] //异常过滤器
    [JWTAuthorize] //授权过滤器
    public class BaseJWTWebApiController : ApiController
    {
        //定义一个属性读取用户信息，以后的控制器如要获取授权中的用户使用继承，将可直接读取该数据
        public JWTData GetJWTData
        {
            get
            {
                //获取授权过滤器过来的数据
                string info = RequestContext.RouteData.Values["Authorization"] as string;
                //很不幸是json格式的字符串
                //json格式的字符串如何转成对象：将用到技术json序列化与反序列
                //什么是json序列化？把对象转成json字符串就是序列化，第一阶段项目，mvc,mvc api底层用的都是序列化
                //什么是json序列化？把json字符串转成json对象.
                //C# json序列化库比较多，这里用Newtonsoft.Json
                //C#的序列化技术还有？XML序列化 ,二进制序列化。。。
                //             https://blog.csdn.net/wangnaisheng/article/details/125196831
                //转换封装方法： https://blog.csdn.net/chinaherolts2008/article/details/118940667 
                //1）包管理器 Newtonsoft.Json  ,引用命名空间 using Newtonsoft.Json;   2)使用提供类的方法，即可转
                JWTData message = JsonConvert.DeserializeObject<JWTData>(info);
                if (message != null)
                {
                    return message;
                }
                return null;
            }
        }
    }

    //定义一个类用来把授权里面数据读出来，请注意需要根据放到jwt中键结构一致，在实际开发中可变
    //本示例是这样的格式：{ "id":1,"adminname":"admin","exp":1678223266.7554026}
    //数据格式：可以在写jwt数据时根据项目构建,一般是用户的主键，和权限。等一些重要的信息
    public class JWTData
    {
        // 用户的主键
        public int user_id { get; set; } //大小写也要一致
        //用户名：
        public string username { get; set; }
        //角色id
        public int role_id { get; set; }
        //时间
        public double exp { get; set; }

    }
}
